package dlwntk6545;

import java.util.List;
import java.util.ArrayList;

public class J04_Collection {

	/*
			
			콜렉션 collection
			객체지향 기반 프로그램 작성시 종종 같은 종류의 
			객체의 묶음 group 이나 다른 종류의 객체 묶음을 함께 쓰는때가 있음
			
			앞서 배운 배열은 같은 종류의 객체 묶음 이지만 
			유연성이 부족하고 크기 조정도 안되고 다른 종류의 객체도 가질 수 없음
			
			다행히 자바에서는 이러한 종류의 객체를 쉽게 다룰 수 있는
			인터페이스와 클래스를 제공 그것은 바로 Collection 프레임워크임
			
			collection 은 다른 객체들의 묶음을 의미
			또 다른 말로 용기 container 라고도 하는데,
			각 요소를 저장, 검색, 조작하는 메서드를 제공
			
			Collection <- Set, List, Queue
			List <- ArrayList, Vector
			Map <- AbstractMap, SortedMap
			AbstractMap <- HashMap
			Iterator, Comparator
			
			이들 대부분은 java.util 패키지에 포함됨
			List
			Collection 의 가장 인기있는 하위 인터페이스임
			ArrayList 는 List 의 가장 자주사용하는 구현클래스임
			List 는 자료를 순서대로 저장하는 특성을 가짐
			FIFO : first in first out 선입선출
			또한, 데이터를 중복으로 저장가능
			단, Set 은 중복 허용불가함
			add 메서드를 통해 데이터를 List 의 맨끝에 추가함
			
			지네릭 generic
			collection 을 배울때 generic 을 빼놓으면 불완전하게
			collection 을 배우는 것임
			collection 을 사용할 때 발생할 수 있는 
			컴파일 시간을 엄격한 자료형 검사로 지원
			또한, 대부분의 collection 을 다룰때 대부분의
			downcasting 을 제거하고 사용할 수 있음
			또한, c++ 에서 제공하는 클래스 템플릿을 작성할 수 있게 해줌(고급)
			
			지네릭에서는 매개변수 자료형인 paraneterized type 을 이용해서
			collection 요소의 자료형을 지정함
			메서드의 매개변수는 ()안에 사용하는 것처럼
			collectuin 에서는 <>안에 매개변수 자료형을 사용함
			List<String> result = null;
			
			
	 */
	
	public static void main(String[] args) {
		
		List a = new ArrayList();
		a.add(123456);
		a.add('수');
		a.add(123.456);
		a.add("김태희입니까");
		a.add(new J03_MemberVO());
		System.out.println(a);
		
		
		//ArrayList 에 저장된 객체를 하나씩 꺼내 출력
		System.out.println(a.get(0));
		System.out.println(a.get(1));
		System.out.println(a.get(2));
		System.out.println(a.get(3));
		System.out.println(a.get(4));
		
		/*
				
				ArrayList 에 저장된 객체를 하나씩 꺼내 변수에 따로 저장
				이유 : ArrayList 에 객체를 저장할때는 대상이 무엇이든 간에 
				무조건 Object 형으로 저장됨. 따라서, ArrayList 에 저장된
				객체를 꺼낼때는 객체의 자료형에 맞춰 downcasting 이 필요 (JDK 5이전)
				
		*/
		int num = (int) a.get(0);
		char chr = (char) a.get(1);
		float floatnum = (float) a.get(2);
		String str = (String) a.get(3);
		
		/*
				
				하지만, 이렇게 해도 일단 오류가 발생하지 않음
				실행하면 비로소 오류가 뜸. 이런 종류의 오류는 찾기 힘듦
				
		*/
		
		char num2 = (char) a.get(0);			//int
		Integer intg = (Integer) a.get(3);		//String
		
		
		//지네릭을 사용했을 경우
		List<String> abc = new ArrayList<String>();
		//abc 라는 콜렉션(동적배열)에는 String 형식의 값만 저장가능하다는 의미
		//List<String> abc = new ArrayList<>();	//JDK
		//abc.add(123);		//자료형 검사후 오류 표시
		//abc.add('a');
		abc.add("김태희");	//정상처리
		
		
		String xyz = abc.get(0);		//형변환은 필요가 없음
		
		
		
	}

}
